/**
 ******************************************************************************
 * @file: motor.h
 * @brief: 电机驱动头文件
 * @author: Mond
 ******************************************************************************
 * @version: 0.1.0
 * @date: 2021/12/8
 * @lastChange: 2021/12/8
 * @history:
 ******************************************************************************
 */

#ifndef _MOTOR_H_
#define _MOTOR_H_

#include "config.h"


typedef struct {
    double P;
    double I;
    double D;
    double target;
    double current;
    double last_bias;
    double integral;
    double result;
} PID_TypeDef;

/*!
 * 电机结构体
 * @param Pwm_Htim 电机 PWM 使用的定时器指针，&htimX
 * @param Pwm_Channel 电机 PWM 使用的通道编号，TIM_CHANNEL_X
 * @param DirN_GPIOx 电机方向控制所接的 GPIO 口，GPIOx
 * @param DirN_GPIO_Pin 电机方向控制所接的 GPIO Pin 编号，GPIO_PIN_x
 * @param velocity_PID PID 结构体
 * @param Encoder_Resolution 电机编码器参数
 */
typedef struct {
    TIM_HandleTypeDef *Pwm_Htim;
    uint32_t Pwm_Channel;
    GPIO_TypeDef *Dir1_GPIOx;
    GPIO_TypeDef *Dir2_GPIOx;
    uint16_t Dir1_GPIO_Pin;
    uint16_t Dir2_GPIO_Pin;
    PID_TypeDef *Velocity_PID;
    uint16_t Encoder_Resolution;
} Motor, *MotorP;

/*!
 * 电机控制函数
 * @param speed 电机速度，-100 ~ 100
 * @param hmotor 电机指针
 */
void motor_Control(float speed, Motor *hmotor);

/*!
 * PID 控制电机
 * @param speed 电机速度，单位 转每秒
 * @param hmotor 电机结构体指针
 */
void motor_PID_Control(float speed, Motor *hmotor);

#endif // _MOTOR_H_
